﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using DevExpress.XtraEditors.DXErrorProvider;
using QuanLyKho.Server.BLL;
using DevExpress.Xpf.Core;
using QuanLyKho.Server;
using DevExpress.Xpf.Grid;
using DevExpress.Xpf.Bars;
using System.ComponentModel;
using QuanLyKho.CommonControl;
using DevExpress.Xpf.Docking;
using QuanLyKho.Server.Enum;

namespace QuanLyKho
{
    /// <summary>
    /// Interaction logic for ucNhapKho.xaml
    /// </summary>
    public partial class ucNhapKho : UserControl
    {
        #region Fields

        private Dm_NhaPhanPhoiBLL dmNhaPhanPhoiBLL;
        private PhieuNhapThuocBLL phieuNhapBLL;
        private PhieuNhapThuocChiTietBLL phieuNhapChiTietBLL;
        private Dm_ThuocBLL dmThuocBLL;
        private TonKhoThuocBLL tonKhoThuocBLL;

        public PhieuNhapThuoc phieuNhapCurrent;
        private BindingList<PhieuNhapThuocChiTiet> listChiTiet;
        private List<Dm_Thuoc> listDmThuoc;
        //private PhieuNhapThuocChiTiet PhieuNhapThuocChiTietCurrent;
        
        // Field cần phải Reset sau khi lưu
        private string validationError;
        private bool? isDialogShowed;
        private Dm_Thuoc DmThuocChon;
        private bool leftNewRow;
        private List<PhieuNhapThuocChiTiet> listChiTietUpdate;

        // Field bắt buộc set trước khi khởi tạo form
        public bool LaPhieuTra { get; set; }

        #endregion

        public ucNhapKho()
        {
            InitializeComponent();
            dmNhaPhanPhoiBLL = new Dm_NhaPhanPhoiBLL();
            dmThuocBLL = new Dm_ThuocBLL();
            phieuNhapBLL = new PhieuNhapThuocBLL();
            phieuNhapChiTietBLL = new PhieuNhapThuocChiTietBLL();

            listChiTietUpdate = new List<PhieuNhapThuocChiTiet>();
            listDmThuoc = new List<Dm_Thuoc>();
            tonKhoThuocBLL = new TonKhoThuocBLL();
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                BindNhaPhanPhoi();

                // Nếu khởi động form phiếu nhập trên menu thì phieuNhapCurrent = null và khởi tạo thêm mới form
                if (phieuNhapCurrent == null)
                {
                    btnThemMoi_ItemClick(null, null);
                }
                else
                {
                    // Trường hợp ngược lại thì load phiếu nhập lên
                    BindPhieuNhap();

                    // Load tiền nợ lên 
                    BindTienNo();
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập Khởi tạo màn hình không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        public void BindPhieuNhap()
        {
            txtIdPhieuNhap.Text = phieuNhapCurrent.IdPhieuNhap.ToString();
            txtSoHoaDon.Text = phieuNhapCurrent.SoHoaDon;
            cboNhaPhanPhoi.EditValue = phieuNhapCurrent.Dm_NhaPhanPhoi;
            deNgayNhap.EditValue = phieuNhapCurrent.NgayNhap;
            txtChietKhau.NullValue = phieuNhapCurrent.ChietKhau.ToString();
            BindPhieuNhapChiTiet(phieuNhapCurrent.IdPhieuNhap);
            if (phieuNhapCurrent.TrangThai == EnumTrangThaiPhieu.DaChotKy)
            {
                txtIdPhieuNhap.Text = phieuNhapCurrent.IdPhieuNhap.ToString() + " (Đã chốt kỳ) ";
                txtIdPhieuNhap.IsReadOnly = true;
                txtSoHoaDon.IsReadOnly = true;
                cboNhaPhanPhoi.IsReadOnly = true;
                deNgayNhap.IsReadOnly = true;
                txtChietKhau.IsReadOnly = true;
                chkLaPhieuNo.IsReadOnly = true;
                txtLyDoNo.IsReadOnly = true;
                gridChiTiet.View.AllowEditing = false;
                SetEnableButton(false, false, false);
            }
        }

        public void BindTienNo()
        {
            TienNo tienNo = phieuNhapCurrent.TienNo;
            chkLaPhieuNo.IsChecked = tienNo != null;
            txtLyDoNo.IsEnabled = tienNo != null;
            txtLyDoNo.Text = tienNo != null ? tienNo.LyDo : string.Empty;
        }

        public void BindNhaPhanPhoi()
        {
            try
            {
                List<Dm_NhaPhanPhoi> listDmNhaPhanPhoi = dmNhaPhanPhoiBLL.RetrieveAllKichHoat();
                cboNhaPhanPhoi.ItemsSource = listDmNhaPhanPhoi;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập thông tin nhà phân phối không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public void BindPhieuNhapChiTiet(int idPhieuNhap)
        {
            try
            {
                listChiTiet = new BindingList<PhieuNhapThuocChiTiet>(phieuNhapChiTietBLL.RetrievePhieuNhapChiTiet(idPhieuNhap));
                gridChiTiet.ItemsSource = listChiTiet;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập thông tin phiếu nhập chi tiết không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void colSoluong_Validate(object sender, DevExpress.Xpf.Grid.GridCellValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (e.Value == null)
                {
                    validationError = "Số lượng không hợp lệ !!!";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                {
                    if (Convert.ToInt32(e.Value) <= 0)
                    {
                        validationError = "Số lượng không hợp lệ !!!";
                        e.IsValid = false;
                        e.SetError(validationError, ErrorType.Warning);
                    }
                    else
                        e.IsValid = true;
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra số lượng không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void colHanDung_Validate(object sender, GridCellValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (e.Value == null)
                {
                    validationError = "Vui lòng nhập hạn dùng !!!";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                {
                    if (Convert.ToDateTime(e.Value) == DateTime.MinValue)
                    {
                        validationError = "Hạn dùng không hợp lệ !!!";
                        e.IsValid = false;
                        e.SetError(validationError, ErrorType.Warning);
                    }
                    else
                        e.IsValid = true;
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra hạn dùng không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private void colSoLo_Validate(object sender, DevExpress.Xpf.Grid.GridCellValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (e.Value == null)
                {
                    validationError = "Vui lòng nhập số lô !!!";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                    e.IsValid = true;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra số lô không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private void tbvChiTiet_InvalidRowException(object sender, DevExpress.Xpf.Grid.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = DevExpress.Xpf.Grid.ExceptionMode.NoAction;
        }

        private void colGiaNhap_Validate(object sender, GridCellValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (e.Value == null)
                {
                    validationError = "Giá nhập không hợp lệ !!!";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                {
                    if (Convert.ToDouble(e.Value) < 0)
                    {
                        validationError = "Giá nhập không hợp lệ !!!";
                        e.IsValid = false;
                        e.SetError(validationError, ErrorType.Warning);
                    }
                    else
                        e.IsValid = true;
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra giá nhập không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void colGiaXuat_Validate(object sender, DevExpress.Xpf.Grid.GridCellValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (e.Value == null)
                {
                    validationError = "Giá xuất không hợp lệ !!!";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                {
                    if (Convert.ToDouble(e.Value) < 0)
                    {
                        validationError = "Giá xuất không hợp lệ !!!";
                        e.IsValid = false;
                        e.SetError(validationError, ErrorType.Warning);
                    }
                    else
                        e.IsValid = true;
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra giá xuất không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void deNgayNhap_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (string.IsNullOrWhiteSpace(deNgayNhap.DisplayText))
                {
                    validationError = "Vui lòng nhập thông tin ngày nhập !!!";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                {
                    // Trường hợp là ngày nhập phải lớn hơn ngày chốt sổ
                    if (!tonKhoThuocBLL.LaChoPhepXuatNhapKho(Convert.ToDateTime(e.Value)))
                    {
                        validationError = "Ngày nhập không thể trước ngày đã chốt sổ !!!";
                        e.IsValid = false;
                        e.SetError(validationError, ErrorType.Warning);
                    }
                    else
                    {
                        e.IsValid = true;
                    }
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra ngày nhập không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void cboNhaPhanPhoi_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (e.Value == null)
                {
                    validationError = "Vui lòng nhập nhà phân phối !!!";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                    e.IsValid = true;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra nhà phân phối không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        public void btnThemMoi_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                // Reset thông tin phiếu nhập
                phieuNhapCurrent = null;
                txtIdPhieuNhap.Clear();
                cboNhaPhanPhoi.EditValue = null;
                chkLaPhieuNo.IsChecked = false;
                txtLyDoNo.IsEnabled = false;
                txtLyDoNo.Clear();
                txtSoHoaDon.Clear();
                txtChietKhau.Clear();
                deNgayNhap.EditValue = DateTime.Now;

                BindPhieuNhapChiTiet(0);
                ResetField();

                SetEnableButton(false, false, false);

                cboNhaPhanPhoi.Focus();
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thêm mới không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private bool KiemTraThongTinPhieuNhap()
        {
            bool isExistingError = false;
            try
            {
                cboNhaPhanPhoi.CausesValidation = true;
                cboNhaPhanPhoi.DoValidate();
                if (cboNhaPhanPhoi.HasValidationError)
                {
                    isExistingError = true;
                }

                txtSoHoaDon.CausesValidation = true;
                txtSoHoaDon.DoValidate();
                if (txtSoHoaDon.HasValidationError)
                {
                    isExistingError = true;
                }

                deNgayNhap.CausesValidation = true;
                deNgayNhap.DoValidate();
                if (deNgayNhap.HasValidationError)
                {
                    isExistingError = true;
                }
            }
            catch (Exception)
            {
                isExistingError = false;
                DXMessageBox.Show("Kiểm tra phiếu nhập không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }

            return isExistingError;
        }

        /// <summary>
        /// Kiểm tra grid chi tiết
        /// </summary>
        /// <returns></returns>
        public bool KiemTraThongTinChiTiet()
        {
            try
            {
                string errorString = string.Empty;
                for (int index = 0; index < this.gridChiTiet.VisibleRowCount; index++)
                {
                    PhieuNhapThuocChiTiet chiTiet = gridChiTiet.GetRow(index) as PhieuNhapThuocChiTiet;
                    if (chiTiet.Dm_Thuoc != null && !string.IsNullOrEmpty(chiTiet.Dm_Thuoc.MaThuoc))
                    {
                        if (!CheckSoLuong(chiTiet, chiTiet.SoLuong, ref errorString))
                        {
                            DXMessageBox.Show(errorString, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                            tbvChiTiet.Focus();
                            tbvChiTiet.FocusedRowHandle = index;
                            tbvChiTiet.FocusedRowHandle = index;
                            tbvChiTiet.FocusedColumn = colSoLuong;
                            return false;
                        }
                        if (!CheckHanDung(chiTiet, chiTiet.HanDung, ref errorString))
                        {
                            DXMessageBox.Show(errorString, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                            tbvChiTiet.Focus();
                            tbvChiTiet.FocusedRowHandle = index;
                            tbvChiTiet.FocusedRowHandle = index;
                            tbvChiTiet.FocusedColumn = colHanDung;
                            return false;
                        }
                        if (!CheckSoLo(chiTiet, chiTiet.SoLo, ref errorString))
                        {
                            DXMessageBox.Show(errorString, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                            tbvChiTiet.Focus();
                            tbvChiTiet.FocusedRowHandle = index;
                            tbvChiTiet.FocusedRowHandle = index;
                            tbvChiTiet.FocusedColumn = colSoLo;
                            return false;
                        }
                    }
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra phiếu nhập chi tiết không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }
            return true;
        }

        private void btnLuu_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                // Lấy vị trí đang tương tác trên grid
                //PhieuNhapThuocChiTietCurrent = gridChiTiet.GetFocusedRow() as PhieuNhapThuocChiTiet;

                gridChiTiet.Focus();
                btnLuu.Focus();

                // Kiểm tra lỗi nếu xảy ra lỗi thì kết thúc xử lý
                if (KiemTraThongTinPhieuNhap())
                {
                    DXMessageBox.Show("Kiểm tra lại thông tin đã nhập", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                if (!KiemTraThongTinChiTiet())
                {
                    return;
                }

                Dm_NhaPhanPhoi dmNhaPhanPhoi = cboNhaPhanPhoi.EditValue as Dm_NhaPhanPhoi;

                // Thực hiện tạo phiếu nhập hoặc cập nhật phiếu nhập
                if (phieuNhapCurrent == null || (phieuNhapCurrent != null && phieuNhapCurrent.IdPhieuNhap == 0))
                {
                    phieuNhapCurrent = new PhieuNhapThuoc();
                    phieuNhapCurrent.MaNhaPhanPhoi = dmNhaPhanPhoi.MaNhaPhanPhoi;
                    phieuNhapCurrent.SoHoaDon = txtSoHoaDon.Text;
                    phieuNhapCurrent.NgayNhap = Convert.ToDateTime(deNgayNhap.EditValue);
                    phieuNhapCurrent.LaPhieuTra = LaPhieuTra;
                    phieuNhapCurrent.ChietKhau = Convert.ToByte(txtChietKhau.Value);

                    // Tạo phiếu nhập
                    phieuNhapBLL.CreatePhieuNhap(phieuNhapCurrent);

                    // Thêm phiếu nhập vừa được tạo vào danh sách bên trái của form Main
                    QuanLyKhoGlobal.ListPhieuNhapThuoc.Insert(0, phieuNhapCurrent);
                }
                else
                {
                    phieuNhapCurrent.Dm_NhaPhanPhoi = dmNhaPhanPhoi;
                    phieuNhapCurrent.MaNhaPhanPhoi = dmNhaPhanPhoi.MaNhaPhanPhoi;
                    phieuNhapCurrent.SoHoaDon = txtSoHoaDon.Text;
                    phieuNhapCurrent.NgayNhap = Convert.ToDateTime(deNgayNhap.EditValue);
                    phieuNhapCurrent.LaPhieuTra = LaPhieuTra;
                    phieuNhapCurrent.ChietKhau = Convert.ToByte(txtChietKhau.Value);
                    phieuNhapBLL.UpdatePhieuNhap(phieuNhapCurrent);

                    // Cập nhật phiếu nhập vừa được tạo vào danh sách bên trái của form Main
                    PhieuNhapThuoc phieuNhapTruocDo = QuanLyKhoGlobal.ListPhieuNhapThuoc.Where(u => u.IdPhieuNhap == phieuNhapCurrent.IdPhieuNhap).FirstOrDefault();
                    if (phieuNhapTruocDo != null)
                    {
                        phieuNhapTruocDo = phieuNhapCurrent;    
                    }

                    // Refresh phiếu nhập
                    (QuanLyKhoGlobal.MainWindow as MainWindow).RefreshPhieuNhap();
                }

                // Thực hiện tạo chi tiết phiếu nhập
                if (!phieuNhapChiTietBLL.CreatePhieuNhapChiTiet(phieuNhapCurrent
                                                            , listChiTiet.Where(u => u.IdPhieuNhapChiTiet == 0).ToList()
                                                            , listChiTietUpdate))
                {
                    DXMessageBox.Show("Lưu thông tin chi tiết không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                // Thực hiện thiết lập hoặc cập nhật tiền nợ
                TienNoBLL tienNoBLL = new TienNoBLL();
                TienNo tienNoCurrent = phieuNhapCurrent.TienNo;
                if (chkLaPhieuNo.IsChecked == true)
                {
                    byte chietKhau = Convert.ToByte(txtChietKhau.Value);
                    // Trường hợp Check thiết lập tiền nợ nhưng chưa thiết lập vào CSDL thì tạo mới tiền nợ
                    if (tienNoCurrent == null)
                    {
                        TienNo tienNo = new TienNo();
                        tienNo.SoTien = listChiTiet.Sum(u => (u.GiaNhap * (100 - chietKhau) / 100) * u.SoLuong);
                        tienNo.IdPhieuNhap = phieuNhapCurrent.IdPhieuNhap;
                        tienNo.LyDo = txtLyDoNo.Text;
                        tienNoBLL.CreateTienNo(tienNo);
                    }
                    else // Trường hợp Check thiết lập tiền nợ và đã thiết lập vào CSDL thì xử lý cập nhật số tiền nợ
                    {
                        tienNoCurrent.SoTien = listChiTiet.Sum(u => (u.GiaNhap * (100 - chietKhau) / 100) * u.SoLuong);
                        tienNoCurrent.IdPhieuNhap = phieuNhapCurrent.IdPhieuNhap;
                        tienNoCurrent.LyDo = txtLyDoNo.Text;
                        tienNoBLL.UpdateTienNo(tienNoCurrent);
                    }
                }
                else
                {
                    // Trường hợp đã tạo nợ trước đó nhưng chưa trả nợ thì thực hiện xóa thiết lập tiền nợ
                    if (tienNoCurrent != null) //&& tienNoCurrent.NgayTra == null)
                    {
                        tienNoBLL.DeleteTienNo(phieuNhapCurrent.TienNo.IdTienNo);
                    }
                }

                // Thực hiện load lại thông tin grid chi tiết
                BindPhieuNhapChiTiet(phieuNhapCurrent.IdPhieuNhap);

                DXMessageBox.Show("Lưu thông tin thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);

                // Thực hiện hiển thị số phiếu nhập
                if (string.IsNullOrEmpty(txtIdPhieuNhap.DisplayText))
                {
                    txtIdPhieuNhap.Text = phieuNhapCurrent.IdPhieuNhap.ToString();
                }

                SetEnableButton(false, false, listChiTiet.Count > 0);

                //// Thiết lập lại vị trí đang tương tác trên grid
                //if (PhieuNhapThuocChiTietCurrent != null)
                //{
                //    tbvChiTiet.Focus();
                //    gridChiTiet.View.FocusedRow = PhieuNhapThuocChiTietCurrent;
                //}
            }
            catch (Exception)
            {
                DXMessageBox.Show("Lưu thông tin không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void btnXoa_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                PhieuNhapThuocChiTiet chiTiet = gridChiTiet.GetFocusedRow() as PhieuNhapThuocChiTiet;
                if (chiTiet == null)
                    return;

                if (DXMessageBox.Show("Bạn chắc chắn xóa thông tin này ?", "Thông báo", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
                {
                    // Nếu item có tồn tại trong CSDL thì xóa trong CSDL và trừ kho
                    if (chiTiet.IdPhieuNhapChiTiet != 0)
                    {
                        if (!phieuNhapChiTietBLL.DeletePhieuNhapChiTiet(chiTiet.IdPhieuNhapChiTiet))
                        {
                            DXMessageBox.Show("Xóa thông tin chi tiết không thành công !", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
                            return;
                        }
                    }

                    // Xóa item cần xóa
                    listChiTiet.Remove(chiTiet);

                    // Load lại danh sách chi tiết phiếu nhập
                    gridChiTiet.ItemsSource = listChiTiet;

                    SetEnableButton(btnLuu.IsEnabled, btnHuyBo.IsEnabled, listChiTiet.Count > 0);
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Xóa thông tin không thành công !", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void btnDong_ItemClick(object sender, ItemClickEventArgs e)
        {
            DockLayoutManager dockLayoutManager = this.Parent as DockLayoutManager;
            if (dockLayoutManager != null)
            {
                BaseLayoutItem bli = dockLayoutManager.ActiveMDIItem;
                if (bli != null)
                {
                    dockLayoutManager.DockController.Close(bli);
                }
            }
            else
            {
                DXWindow window = this.Parent as DXWindow;
                if (window != null)
                {
                    window.Close();
                }
            }
        }

        private void btnHuyBo_ItemClick(object sender, DevExpress.Xpf.Bars.ItemClickEventArgs e)
        {
            try
            {
                if (phieuNhapCurrent == null || (phieuNhapCurrent != null && phieuNhapCurrent.IdPhieuNhap == 0))
                {
                    btnThemMoi_ItemClick(null, null);
                }
                else
                {
                    ResetField();
                    BindPhieuNhap();
                    BindTienNo();
                    BindPhieuNhapChiTiet(phieuNhapCurrent.IdPhieuNhap);
                    SetEnableButton(false, false, listChiTiet.Count > 0);
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Hủy bỏ thông tin không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private void tbvChiTiet_FocusedRowChanged(object sender, DevExpress.Xpf.Grid.FocusedRowChangedEventArgs e)
        {
            if (gridChiTiet.VisibleRowCount == 1 && tbvChiTiet.FocusedRow == null)
            {
                tbvChiTiet.MoveFirstRow();
            }
            //Neu !=null la da nhap lieu xong tren dong moi va da~ hoan thanh bam xuong' hoac Enter
            if (leftNewRow)
                FocusHomeCommand.Execute(null, null);
        }

        private void tbvChiTiet_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            leftNewRow = false;
        }

        private void tbvChiTiet_RowUpdated(object sender, RowEventArgs e)
        {
            if (e.RowHandle == GridControl.NewItemRowHandle)
            {
                PhieuNhapThuocChiTiet chiTiet = e.Row as PhieuNhapThuocChiTiet;
                if (chiTiet != null)
                    leftNewRow = true;
            }
        }

        private void deNgayNhap_EditValueChanging(object sender, DevExpress.Xpf.Editors.EditValueChangingEventArgs e)
        {
            try
            {
                if (e.NewValue != null && e.OldValue != null)
                {
                    if (Convert.ToDateTime(e.NewValue).Date != Convert.ToDateTime(e.NewValue).Date)
                    {
                        SetEnableButton(true, true, listChiTiet.Count > 0);
                    }
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thay đổi ngày nhập không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private void cboNhaPhanPhoi_EditValueChanging(object sender, DevExpress.Xpf.Editors.EditValueChangingEventArgs e)
        {
            try
            {
                if (e.NewValue != null && e.OldValue != null)
                {
                    if (e.NewValue.ToString() != e.OldValue.ToString())
                    {
                        SetEnableButton(true, true, listChiTiet.Count > 0);
                    }
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thay đổi nhà phân phối không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private void txtSoHoaDon_KeyDown(object sender, KeyEventArgs e)
        {
            SetEnableButton(true, true, listChiTiet.Count > 0);
        }

        private void txtChietKhau_EditValueChanging(object sender, DevExpress.Xpf.Editors.EditValueChangingEventArgs e)
        {
            SetEnableButton(true, true, listChiTiet.Count > 0);
        }

        private void txtLyDoNo_KeyUp(object sender, KeyEventArgs e)
        {
            SetEnableButton(true, true, listChiTiet.Count > 0);
        }

        private void txtLyDoNo_KeyDown(object sender, KeyEventArgs e)
        {
            SetEnableButton(true, true, listChiTiet.Count > 0);
        }

        private void txtSoHoaDon_KeyUp(object sender, KeyEventArgs e)
        {
            SetEnableButton(true, true, listChiTiet.Count > 0);
        }

        public bool CheckMaThuoc(string maThuoc)
        {
            if (string.IsNullOrEmpty(maThuoc))
            {
                validationError = "Vui lòng nhập mã thuốc";
                return false;
            }

            if (dmThuocBLL.RetrieveById(maThuoc) == null)
            {
                validationError = "Mã thuốc không hợp lệ";
                return false;
            }

            return true;
        }

        private void colMaThuoc_Validate(object sender, GridCellValidationEventArgs e)
        {
            try
            {
                validationError = string.Empty;
                if (!CheckMaThuoc((string)e.Value))
                {
                    tbvChiTiet.FocusedColumn = colMaThuoc;
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Critical);
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra mã thuốc không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void tbvChiTiet_ValidateRow(object sender, DevExpress.Xpf.Grid.GridRowValidationEventArgs e)
        {
            try
            {
                PhieuNhapThuocChiTiet chiTietNewOrUpdate = (PhieuNhapThuocChiTiet)e.Row;
                if (chiTietNewOrUpdate == null)
                    return;

                if (!CheckMaThuoc(chiTietNewOrUpdate.MaThuoc))
                {
                    tbvChiTiet.FocusedColumn = colMaThuoc;
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Critical);
                    return;
                }

                AddToListUpdateChiTiet(chiTietNewOrUpdate);
                DmThuocChon = null;
                validationError = string.Empty;
                leftNewRow = false;
            }
            catch (Exception)
            {
                DXMessageBox.Show("Kiểm tra dòng dữ liệu chi tiết không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
           
        }

        private void chkLaPhieuNo_Checked(object sender, RoutedEventArgs e)
        {
            txtLyDoNo.IsEnabled = true;
        }

        private void chkLaPhieuNo_Unchecked(object sender, RoutedEventArgs e)
        {
            txtLyDoNo.IsEnabled = false;
        }

        private void tbvChiTiet_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                int rowHandle = tbvChiTiet.FocusedRowHandle;
                if (e.Key == Key.Enter)
                {
                    SetEnableButton(true, true, listChiTiet.Count > 0);
                    int colIndex = gridChiTiet.Columns.IndexOf(tbvChiTiet.FocusedColumn);
                    // Trường hợp nhấn Enter khi con trỏ đang ở các column: Mã thuốc
                    // Và: isAllowEditing = true (cho phép insert, update)
                    if ((gridChiTiet.Columns[colIndex].FieldName == "MaThuoc")
                        && (this.colMaThuoc.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        TextBox maThuocTextbox = (TextBox)e.OriginalSource;
                        LayThuocTrongDanhMuc(maThuocTextbox, null, 0);
                        tbvChiTiet.FocusedColumn = colSoLo;
                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "Dm_Thuoc.TenThuoc")
                        && (this.colTenThuoc.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        TextBox tenThuocTextbox = (TextBox)e.OriginalSource;
                        LayThuocTrongDanhMuc(null, tenThuocTextbox, 1);
                        tbvChiTiet.FocusedColumn = colSoLo;
                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "SoLuong")
                        && (this.colSoLuong.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        if (rowHandle >= 0)
                        {
                            tbvChiTiet.FocusedColumn = colSoLo;
                            tbvChiTiet.FocusedRowHandle = rowHandle + 1;
                            tbvChiTiet.FocusedColumn = colSoLuong;
                        }
                        else
                            tbvChiTiet.FocusedColumn = colSoLo;

                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "GiaNhap")
                        && (this.colGiaXuat.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        if (rowHandle >= 0)
                        {
                            tbvChiTiet.FocusedColumn = colSoLo;
                            tbvChiTiet.FocusedRowHandle = rowHandle + 1;
                            tbvChiTiet.FocusedColumn = colGiaNhap;
                        }
                        else
                            tbvChiTiet.FocusedColumn = colSoLo;

                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "GiaXuat")
                        && (this.colGiaXuat.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        if (rowHandle >= 0)
                        {
                            tbvChiTiet.FocusedColumn = colSoLo;
                            tbvChiTiet.FocusedRowHandle = rowHandle + 1;
                            tbvChiTiet.FocusedColumn = colGiaXuat;
                        }
                        else
                            tbvChiTiet.FocusedColumn = colSoLo;

                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "HanDung")
                        && (this.colHanDung.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        if (rowHandle >= 0)
                        {
                            tbvChiTiet.FocusedColumn = colSoLo;
                            tbvChiTiet.FocusedRowHandle = rowHandle + 1;
                            tbvChiTiet.FocusedColumn = colHanDung;
                        }
                        else
                            tbvChiTiet.FocusedColumn = colSoLo;

                    }
                    if ((gridChiTiet.Columns[colIndex].FieldName == "SoLo")
                        && (this.colSoLo.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        if (rowHandle >= 0)
                        {
                            tbvChiTiet.FocusedColumn = colSoLo;
                            tbvChiTiet.FocusedRowHandle = rowHandle + 1;
                            tbvChiTiet.FocusedColumn = colSoLo;
                        }
                        else
                            tbvChiTiet.FocusedColumn = colSoLo;

                    }
                    if (e.OriginalSource is TableView)
                    {
                        tbvChiTiet.FocusedColumn = colMaThuoc;
                        tbvChiTiet.FocusedColumn = colTenThuoc;
                    }
                }
                else if (e.Key == Key.Up)
                {
                    if (rowHandle == 0)
                        tbvChiTiet.FocusedColumn = colTenThuoc;
                }
                else if (e.Key == Key.Escape)
                {
                    validationError = string.Empty;
                    tbvChiTiet.CancelRowEdit();
                    if (rowHandle < 0)
                        tbvChiTiet.DeleteRow(rowHandle);
                }
                else if (e.Key == Key.Down)
                    leftNewRow = false;
                else
                    SetEnableButton(true, true, true);
            }
            catch (Exception)
            {
                DXMessageBox.Show("Tương tác không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        /// <summary>
        /// Lay danh sach thuoc trong danh muc
        /// </summary>
        /// <param name="maThuocTextbox"></param>
        public void LayThuocTrongDanhMuc(TextBox maThuocTextbox, TextBox tenThuocTextBox, byte focusColumn)
        {
            frmNhapKhoTimKiemThuoc timKiemThuoc = new frmNhapKhoTimKiemThuoc();
            timKiemThuoc.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            timKiemThuoc.ResizeMode = ResizeMode.NoResize;
            timKiemThuoc.Width = timKiemThuoc.Width + 10;
            timKiemThuoc.Height = timKiemThuoc.Height + 10;
            timKiemThuoc.Title = "Chọn thuốc trong danh sách";
            ThemeManager.SetThemeName(timKiemThuoc, "Office2007Blue");
            if (listDmThuoc.Count == 0)
                listDmThuoc = dmThuocBLL.RetrieveAll();
            timKiemThuoc.SearchThuoc(listDmThuoc, maThuocTextbox != null ? maThuocTextbox.Text : string.Empty, tenThuocTextBox != null ? tenThuocTextBox.Text : string.Empty, focusColumn);
            timKiemThuoc.WindowStartupLocation = WindowStartupLocation.CenterScreen;
            if (timKiemThuoc.rowCount > 1)
                isDialogShowed = timKiemThuoc.ShowDialog();
            if (timKiemThuoc.DmThuocChon == null)
            {
                isDialogShowed = null;
                if (focusColumn == 0)
                    maThuocTextbox.Text = string.Empty;
                else if (focusColumn == 1)
                    tenThuocTextBox.Text = string.Empty;
                return;
            }
            else
            {
                DmThuocChon = timKiemThuoc.DmThuocChon;
                if (focusColumn == 0)
                    maThuocTextbox.Text = DmThuocChon.MaThuoc;
                else if (focusColumn == 1)
                    tenThuocTextBox.Text = DmThuocChon.TenThuoc;
            }
        }

        private void tbvChiTiet_CellValueChanged(object sender, CellValueChangedEventArgs e)
        {
            try
            {
                PhieuNhapThuocChiTiet phieuChiTiet = e.Row as PhieuNhapThuocChiTiet;
                if (phieuChiTiet == null)
                    return;
                if (e.Column.FieldName == "MaThuoc")
                {
                    // Trường hợp nhập nhập mã thuốc rồi tab không bấm Enter
                    if (isDialogShowed == null)
                    {
                        DmThuocChon = dmThuocBLL.RetrieveById(e.Value.ToString());
                        if (DmThuocChon == null)
                        {
                            isDialogShowed = null;
                            return;
                        }
                    }
                    phieuChiTiet.MaThuoc = DmThuocChon.MaThuoc;
                    phieuChiTiet.GiaNhap = DmThuocChon.GiaNhap;
                    phieuChiTiet.GiaXuat = DmThuocChon.GiaXuat;
                    phieuChiTiet.Dm_Thuoc = DmThuocChon;
                    phieuChiTiet.SoLuong = 0;
                    phieuChiTiet.ChietKhau = Convert.ToByte(txtChietKhau.Value);
                    phieuChiTiet.SoLo = string.Empty;
                    isDialogShowed = null;
                    DmThuocChon = null;
                }
                else if (e.Column.FieldName == "Dm_Thuoc.TenThuoc")
                {
                    if (isDialogShowed == null)
                    {
                        DmThuocChon = dmThuocBLL.RetrieveByTenThuoc(e.Value.ToString());
                        if (DmThuocChon == null)
                        {
                            isDialogShowed = null;
                            return;
                        }
                    }

                    phieuChiTiet.MaThuoc = DmThuocChon.MaThuoc;
                    phieuChiTiet.GiaNhap = DmThuocChon.GiaNhap;
                    phieuChiTiet.GiaXuat = DmThuocChon.GiaXuat;
                    phieuChiTiet.Dm_Thuoc = DmThuocChon;
                    phieuChiTiet.SoLuong = 0;
                    phieuChiTiet.ChietKhau = Convert.ToByte(txtChietKhau.Value);
                    phieuChiTiet.SoLo = string.Empty;
                    isDialogShowed = null;
                    DmThuocChon = null;
                }

                // Add vào danh sách cần Update
                AddToListUpdateChiTiet(phieuChiTiet);
                SetEnableButton(true, true, listChiTiet.Count > 0);
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập thông tin không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void AddToListUpdateChiTiet(PhieuNhapThuocChiTiet phieuChiTiet)
        {
            if (phieuChiTiet.IdPhieuNhap > 0)
            {
                PhieuNhapThuocChiTiet dtoTrungLap = null;
                foreach (PhieuNhapThuocChiTiet item in listChiTietUpdate)
                {
                    if (item.IdPhieuNhap == phieuChiTiet.IdPhieuNhap)
                    {
                        dtoTrungLap = item;
                        break;
                    }
                }

                if (dtoTrungLap != null)
                {
                    listChiTietUpdate.Remove(dtoTrungLap);
                    dtoTrungLap = null;
                }

                listChiTietUpdate.Add(phieuChiTiet);
            }
        }

        private void tbvChiTiet_InitNewRow(object sender, InitNewRowEventArgs e)
        {
            try
            {
                (gridChiTiet.GetRow(GridControl.NewItemRowHandle) as PhieuNhapThuocChiTiet).Dm_Thuoc = new Dm_Thuoc();
            }
            catch (Exception)
            {
                DXMessageBox.Show("Khởi tạo thông tin thuốc dòng mới không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        /// <summary>
        /// Kiem tra so luong trên grid chi tiêt
        /// </summary>
        /// <param name="soLuong"></param>
        /// <returns></returns>
        private bool CheckSoLuong(PhieuNhapThuocChiTiet chiTiet, object soLuong, ref string errorString)
        {
            if (soLuong == null)
            {
                errorString = "Vui lòng nhập số lượng !!!";
                return false;
            }
            else if (Convert.ToDouble(soLuong) <= 0)
            {
                errorString = "Số lượng không hợp lệ";
                return false;
            }

            return true;
        }

        /// <summary>
        /// Kiem tra hạn dùng trên grid chi tiết
        /// </summary>
        /// <param name="soLuong"></param>
        /// <returns></returns>
        private bool CheckHanDung(PhieuNhapThuocChiTiet chiTiet, object hanDung, ref string errorString)
        {
            if (hanDung == null)
            {
                errorString = "Vui lòng nhập hạn dùng !!!";
                return false;
            }
            else if (Convert.ToDateTime(hanDung).Date == DateTime.MinValue.Date)
            {
                errorString = "Hạn dùng không hợp lệ";
                return false;
            }

            return true;
        }

        /// <summary>
        /// Kiem tra số lô trên grid chi tiết
        /// </summary>
        /// <param name="soLuong"></param>
        /// <returns></returns>
        private bool CheckSoLo(PhieuNhapThuocChiTiet chiTiet, object soLo, ref string errorString)
        {
            if (soLo == null || string.IsNullOrEmpty(soLo.ToString()))
            {
                errorString = "Vui lòng nhập số lô !!!";
                return false;
            }

            return true;
        }

        public void ResetField()
        { 
            validationError = string.Empty;
            isDialogShowed = null;
            DmThuocChon = null;
            leftNewRow = false;
            listChiTietUpdate = new List<PhieuNhapThuocChiTiet>();
        }

        #region Enable Button

        public void SetEnableButton(bool buttonLuu, bool buttonHuyBo, bool buttonXoa)
        {
            if (phieuNhapCurrent != null && phieuNhapCurrent.TrangThai == EnumTrangThaiPhieu.DaChotKy)
            {
                btnLuu.IsEnabled = false;
                btnHuyBo.IsEnabled = false;
                btnXoa.IsEnabled = false;
            }
            else
            {
                btnLuu.IsEnabled = buttonLuu;
                btnHuyBo.IsEnabled = buttonHuyBo;
                btnXoa.IsEnabled = buttonXoa;
            }
        }

        #endregion

        #region Set Quick Key

        public static RoutedCommand FocusHomeCommand = new RoutedCommand();

        private void FocusHomeCommandCanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = true;
        }

        private void FocusHomeCommandExecute(object sender, ExecutedRoutedEventArgs e)
        {
            tbvChiTiet.FocusedRowHandle = GridControl.NewItemRowHandle;
            tbvChiTiet.Focus();
            tbvChiTiet.FocusedColumn = colTenThuoc;
        }

        private void TbviewDanhSachDonThuoc_Loaded(object sender, RoutedEventArgs e)
        {
            tbvChiTiet.FocusedRowHandle = GridControl.NewItemRowHandle;
            tbvChiTiet.Focus();
            tbvChiTiet.FocusedColumn = colTenThuoc;
        }

        #endregion

        private void txtChietKhau_EditValueChanged(object sender, DevExpress.Xpf.Editors.EditValueChangedEventArgs e)
        {
            if (e.NewValue != null && listChiTiet.Count > 0)
            {
                foreach (var item in listChiTiet)
                {
                    item.ChietKhau = Convert.ToByte(e.NewValue);
                }

                gridChiTiet.RefreshData();
            }
        }
    }
}
